//首先需要先获取路由文件router，但路由是通过Express框架扩展出来的，所以需要通过框架拿到路由
let express = require('express');
let router = express.Router();

//加载模型表
let Goods = require('../models/goods');

//实现路由
router.get("/list", (req, res, next) => {    //回调中的第三个参数next，就是往后继续执行的对象
    let page = parseInt(req.param("page"));           //获取当前页码。使用req.param获取到的是字符串，所以转为int类型
    let pageSize = parseInt(req.param("pageSize"));   //页面容量
    let sort = parseInt(req.param("sort"));           //获取排序参数，1是升序，-1是降序
    let skip = (page - 1) * pageSize;                 //跳过几条数据，相当于mysql的offset
    let params = {};                                  //查询参数

    let priceLevel = req.param("priceLevel");
    let priceGt = '';
    let priceLte = '';
    if (priceLevel != 'all') {
        switch (priceLevel) {
            case '0':
                priceGt = 0;
                priceLte = 100;
                break;
            case '1':
                priceGt = 100;
                priceLte = 500;
                break;
            case '2':
                priceGt = 500;
                priceLte = 1000;
                break;
            case '3':
                priceGt = 1000;
                priceLte = 5000;
                break;
        }
        params.salePrice = {
            $gt: priceGt,
            $lte: priceLte
        }
    }

    let goodsModel = Goods.find(params).skip(skip).limit(pageSize);   //根据查询参数查询，以及分页
    goodsModel.sort({"salePrice": sort});            //查询到了数据之后，进行排序
    goodsModel.exec((err, doc) => {                    //查询执行
        if (err) {
            res.json({    //输出一个json文件
                status: '1',
                msg: err.message
            });
        } else {
            res.json({
                status: '0',
                msg: '',
                result: {
                    count: doc.length,
                    list: doc
                }
            });
        }
    })
});

//商品加入购物车
router.post("/addCart", (req, res, next) => {
    let userId = '100000077'        //测试，写死一个userId
    let productId = req.body.productId      //post请求是这么取值的
    let User = require('../models/users')   //获取users表模型

    User.findOne({userId: userId}, (err, userDoc) => {
        if (err) {
            res.json({
                status: "1",
                msg: err.message
            })
        } else {
            if (userDoc) {
                //循环User的购物车List，查看购物车中是否已经存在该商品，如果存在，就不能再插入了，而是商品数量+1
                let exists = false
                userDoc.cartList.forEach(item => {
                    if (item.productId == productId) {
                        exists = true
                        item.productNum++
                        item.checked = true
                    }
                })
                if (exists) {       //如果购物车已有此商品，商品数量+1之后就可以保存了
                    userDoc.save((err, doc) => {
                        if (err) {
                            res.json({
                                status: "1",
                                msg: err.message
                            })
                        } else {
                            res.json({
                                status: "0",
                                msg: "",
                                result: "exists"
                            })
                        }
                    })
                } else {           //购物车没有此商品
                    Goods.findOne({productId: productId}, (err, doc) => {
                        if (err) {
                            res.json({
                                status: "1",
                                msg: err.message
                            })
                        } else {
                            if (doc) {
                                doc.productNum = 1      //默认数量是1，需要在表模型中添加此字段，虽然数据库中不需要
                                doc.checked = true      //默认是选中，需要在表模型中添加此字段，虽然数据库中不需要

                               /*
                                * checked 和 productNum 其实在 Goods 集合中是不需要的，但是在购物车模型中会用到。
                                * 购物车中，需要知道这个商品有没有选中，以及数量是多少。
                                * 在通过 Mongo 定义模型的时候，商品模型和购物车模型可以复用，所以把字段合到一起。
                                *
                                * 如果不在 Goods 表模型中加入这两个字段，那么这两条数据将不能顺利存储
                                * */

                                userDoc.cartList.push(doc)
                                userDoc.save((err, doc) => {
                                    if (err) {
                                        res.json({
                                            status: "1",
                                            msg: err.message
                                        })
                                    } else {
                                        res.json({
                                            status: "0",
                                            msg: "",
                                            result: "not exists"
                                        })
                                    }
                                })
                            }
                        }
                    })
                }
            }
        }
    })
});

module.exports = router;